package sd.settemmezzo.crash;

import org.apache.log4j.Logger;

import sd.settemmezzo.common.Player;
import sd.settemmezzo.player.state.GlobalState;
import sd.settemmezzo.player.state.LocalState;
import sd.settemmezzo.util.Debug;
import sd.settemmezzo.util.Util;

public class CrashManager {
	
	private static Logger log = Logger.getLogger("CrashManager");
	private static LocalState lstate = LocalState.getInstance();
	static int retry = 3; 
	
	/* Gestisce il crash di un nodo in seguito a una mancata ricezione dello stato */
	public static GlobalState crashGlobalState(Player nextPlayer, GlobalState gs) {
		log.error("[crashGlobalState] " + nextPlayer.getNamePlayer() + " in crash");

		gs.getRing().crash(nextPlayer);

		lstate.setNextPlayer(gs.getRing().getNext(lstate.getId()));
		log.fatal("NEXT PLAYER: " + lstate.getNextPlayer() == null ? "null" : lstate.getNextPlayer().getNamePlayer());
		
		/* Se è crashato il destinatario del token */
		if (nextPlayer.getId() == gs.getToken()) {
			gs.setToken(lstate.getNextPlayer().getId());
		}
		
		/* Se è il leader ad essere crashato, mi eleggo leader */
		if (!gs.getRing().contains(gs.getLeader())) {
			lstate.setRuolo("leader");
			gs.setLeader(Util.electBully(gs.getRing()));
			log.warn("[SendThread] Mi sono eletto Leader");
			
			/* Se il leader era anche mazziere, rieleggo il mazziere */
			if (!gs.getRing().contains(gs.getMazziere())) {
				
				//gstate.setMazziere(Util.scegliMazziere(gstate.getPlayersList()));
				gs.setMazziere(gs.getLeader()); // che sono io...
				log.error("[SendThread] Mi sono eletto Mazziere");
			}
		}
		
		return gs;
	}
	
	/* Gestisce il crash di un nodo scoperto in seguito ad un ping */
	public static GlobalState crashOnPing(Player crashedPlayer, GlobalState gs) {
		log.error("sono in [crashOnPing]");
		
		gs.getRing().crash(crashedPlayer);

		lstate.setNextPlayer(gs.getRing().getNext(lstate.getId()));
		
		/* Se è crashato il nodo con il token */
		if (crashedPlayer.getId() == gs.getToken()) {
			gs.setToken(gs.getRing().getNext(lstate.getId()).getId());
		}
		
		log.error("[crashOnPing] " + Debug.printPlayersList(gs.getRing()));
		
		return gs;
	}
	
}
